home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / bin / samrdump.py < prev    next >
Text File  |  2006-06-30  |  6KB  |  183 lines

  1. #!/usr/bin/python
  2. # Copyright (c) 2003 CORE Security Technologies
  3. #
  4. # This software is provided under under a slightly modified version
  5. # of the Apache Software License. See the accompanying LICENSE file
  6. # for more information.
  7. #
  8. # $Id: samrdump.py,v 1.2 2003/11/14 21:26:07 jkohen Exp $
  9. #
  10. # Description: DCE/RPC SAMR dumper.
  11. #
  12. # Author:
  13. #  Javier Kohen <jkohen@coresecurity.com>
  14. #
  15. # Reference for:
  16. #  DCE/RPC.
  17.  
  18. import socket
  19. import string
  20. import sys
  21. import types
  22.  
  23. from impacket import uuid
  24. from impacket.dcerpc import dcerpc_v4, dcerpc, transport, samr
  25.  
  26.  
  27. class ListUsersException(Exception):
  28.     pass
  29.  
  30. class SAMRDump:
  31.     KNOWN_PROTOCOLS = {
  32.         '139/SMB': (r'ncacn_np:%s[\pipe\samr]', 139),
  33.         '445/SMB': (r'ncacn_np:%s[\pipe\samr]', 445),
  34.         }
  35.  
  36.  
  37.     def __init__(self, protocols = None,
  38.                  username = '', password = ''):
  39.         if not protocols:
  40.             protocols = SAMRDump.KNOWN_PROTOCOLS.keys()
  41.  
  42.         self.__username = username
  43.         self.__password = password
  44.         self.__protocols = protocols
  45.  
  46.  
  47.     def dump(self, addr):
  48.         """Dumps the list of users and shares registered present at
  49.         addr. Addr is a valid host name or IP address.
  50.         """
  51.  
  52.         encoding = sys.getdefaultencoding()
  53.  
  54.         print 'Retrieving endpoint list from %s' % addr
  55.  
  56.         # Try all requested protocols until one works.
  57.         entries = []
  58.         for protocol in self.__protocols:
  59.             protodef = SAMRDump.KNOWN_PROTOCOLS[protocol]
  60.             port = protodef[1]
  61.  
  62.             print "Trying protocol %s..." % protocol
  63.             rpctransport = transport.SMBTransport(addr, port, r'\samr', self.__username, self.__password)
  64.  
  65.             try:
  66.                 entries = self.__fetchList(rpctransport)
  67.             except Exception, e:
  68.                 print 'Protocol failed: %s' % e
  69.                 raise
  70.             else:
  71.                 # Got a response. No need for further iterations.
  72.                 break
  73.  
  74.  
  75.         # Display results.
  76.  
  77.         for entry in entries:
  78.             (username, uid, user) = entry
  79.             base = "%s (%d)" % (username, uid)
  80.             print base + '/Enabled:', ('false', 'true')[user.is_enabled()]
  81.             print base + '/Last Logon:', user.get_logon_time()
  82.             print base + '/Last Logoff:', user.get_logoff_time()
  83.             print base + '/Kickoff:', user.get_kickoff_time()
  84.             print base + '/Last PWD Set:', user.get_pwd_last_set()
  85.             print base + '/PWD Can Change:', user.get_pwd_can_change()
  86.             print base + '/PWD Must Change:', user.get_pwd_must_change()
  87.             print base + '/Group id: %d' % user.get_group_id()
  88.             print base + '/Bad pwd count: %d' % user.get_bad_pwd_count()
  89.             print base + '/Logon count: %d' % user.get_logon_count()
  90.             items = user.get_items()
  91.             for i in samr.MSRPCUserInfo.ITEMS.keys():
  92.                 name = items[samr.MSRPCUserInfo.ITEMS[i]].get_name()
  93.                 name = name.encode(encoding, 'replace')
  94.                 print base + '/' + i + ':', name
  95.  
  96.         if entries:
  97.             num = len(entries)
  98.             if 1 == num:
  99.                 print 'Received one entry.'
  100.             else:
  101.                 print 'Received %d entries.' % num
  102.         else:
  103.             print 'No entries received.'
  104.  
  105.  
  106.     def __fetchList(self, rpctransport):
  107.         dce = dcerpc.DCERPC_v5(rpctransport)
  108.  
  109.         encoding = sys.getdefaultencoding()
  110.         entries = []
  111.  
  112.         dce.connect()
  113.         dce.bind(samr.MSRPC_UUID_SAMR)
  114.         rpcsamr = samr.DCERPCSamr(dce)
  115.  
  116.         try:
  117.             resp = rpcsamr.connect()
  118.             if resp.get_return_code() != 0:
  119.                 raise ListUsersException, 'Connect error'
  120.  
  121.             _context_handle = resp.get_context_handle()
  122.             resp = rpcsamr.enumdomains(_context_handle)
  123.             if resp.get_return_code() != 0:
  124.                 raise ListUsersException, 'EnumDomain error'
  125.  
  126.             domains = resp.get_domains().elements()
  127.  
  128.             print 'Found domain(s):'
  129.             for i in range(0, resp.get_entries_num()):
  130.                 print " . %s" % domains[i].get_name()
  131.  
  132.             print "Looking up users in domain %s" % domains[0].get_name()
  133.             resp = rpcsamr.lookupdomain(_context_handle, domains[0])
  134.             if resp.get_return_code() != 0:
  135.                 raise ListUsersException, 'LookupDomain error'
  136.  
  137.             resp = rpcsamr.opendomain(_context_handle, resp.get_domain_sid())
  138.             if resp.get_return_code() != 0:
  139.                 raise ListUsersException, 'OpenDomain error'
  140.  
  141.             domain_context_handle = resp.get_context_handle()
  142.             resp = rpcsamr.enumusers(domain_context_handle)
  143.             if resp.get_return_code() != 0:
  144.                 raise ListUsersException, 'OpenDomainUsers error'
  145.  
  146.             for user in resp.get_users().elements():
  147.                 uname = user.get_name().encode(encoding, 'replace')
  148.                 uid = user.get_id()
  149.  
  150.                 r = rpcsamr.openuser(domain_context_handle, uid)
  151.                 print "Found user: %s, uid = %d" % (uname, uid)
  152.  
  153.                 if r.get_return_code() == 0:
  154.                     info = rpcsamr.queryuserinfo(r.get_context_handle()).get_user_info()
  155.                     entry = (uname, uid, info)
  156.                     entries.append(entry)
  157.                     c = rpcsamr.closerequest(r.get_context_handle())
  158.         except ListUsersException, e:
  159.             print "Error listing users: %s" % e
  160.  
  161.         dce.disconnect()
  162.  
  163.         return entries
  164.  
  165.  
  166. # Process command-line arguments.
  167. if __name__ == '__main__':
  168.     if len(sys.argv) <= 1:
  169.         print "Usage: %s [username[:password]@]<address> [protocol list...]" % sys.argv[0]
  170.         print "Available protocols: %s" % SAMRDump.KNOWN_PROTOCOLS.keys()
  171.         print "Username and password are only required for certain transports, eg. SMB."
  172.         sys.exit(1)
  173.  
  174.     import re
  175.  
  176.     username, password, address = re.compile('(?:([^@:]*)(?::([^@]*))?@)?(.*)').match(sys.argv[1]).groups('')
  177.  
  178.     if len(sys.argv) > 2:
  179.         dumper = SAMRDump(sys.argv[2:], username, password)
  180.     else:
  181.         dumper = SAMRDump(username = username, password = password)
  182.     dumper.dump(address)
  183.